struct buf {
  int valid;   //该buffer包含对应磁盘块的数据
  int disk;    //缓存区的内容是否已经被提交到了磁盘
  uint dev;    //设备号
  uint blockno;//缓存的磁盘块号
  struct sleeplock lock;//睡眠锁
  uint refcnt; //该块被引用次数（即被多少个进程拥有）
  struct buf *prev; //双向链表
  struct buf *next;
  uchar data[BSIZE];//存储内容
};